В C++ каждое выражение приводит к либо л-значению либо р-значению. Это различие определяет, ссылается ли выражение на идентичность объекта идентичность (где он находится) или его значение (что он содержит).
1. Идентичность против содержимого
Объект л-значению (локаторное значение) представляет объект с постоянным адресом в памяти. Представьте себе его как помеченный ящик в ОЗУ. Напротив, р-значению (значение для чтения) является временным; оно представляет временное результат или литерал, у которого нет доступного программисту адреса.
2. Функциональные переходы
Хотя л-значение может выступать как р-значение (компилятор просто извлекает значение внутри коробки), обратное запрещено. Вы не можете использовать р-значение там, где требуется л-значение — например, вы не можете взять адрес литерального числа, такого как &42 потому что у него отсутствует постоянная идентичность.
$$ \text{Л-значение} \xrightarrow{\text{Преобразование}} \text{Р-значение} \quad (\text{Разрешено}) $$
$$ \text{Р-значение} \xrightarrow{\text{Присваивание}} \text{Л-значение} \quad (\text{Запрещено}) $$